# -*- coding:utf-8 -*-

#实现图片验证码和短信验证码的逻辑


import logging
from . import api
from flask import session, request,abort,current_app,jsonify,make_response,json
from ihome import redis_store
from ihome.utils.captcha.captcha import captcha
from ihome import constants
from ihome.utils.response_code import RET
import re,random
from ihome.models import User



@api.route('/imagecode')
def get_image_code():
    '''
    1获取传入的验证码编号，判断是否有指
    2.生成图片验证按摩
    3  保存编号和其对应的图片验证码的内容到redis
    4返回验证码图片
    :return: 
    '''
    #获取验证码编号
    args = request.args
    cur = args.get('cur')
    pre = args.get('pre')
    if not cur:
        abort(403)
    #生成图片验证码
    _,text,image = captcha.generate_captcha()
    #redis中保存的ImageCode_9c340b63-40d1-4146-b67a-e32e1fdc5fc2图片验证码信息
    #TODO 在控制台输出验证码信息
    current_app.logger.debug(text)

    #保存编号机器验证码
    try:
        #删除之前保存的数据
        redis_store.delete('Imagecode_'+pre)
        redis_store.set('ImageCode_'+cur,text,constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        #出现错误返回json信息
        return jsonify(errno=RET.DBERR,errmsg='保存验证码失败' )
    #返回验证码图片
    respons = make_response(image)
    respons.headers['Content-Type'] = 'image/jpg'
    return respons


@api.route('/smscode',methods=['POST'])
def send_sms():
    '''
    1.接收参数并判断是否有值
    2.校验手机号是否正确
    3.通过传入的图片编码去redis中查询真是的图片验证码内容
    4.进行验证码的内容的比对
    5.生成发送短信的内容并发送短信
    6.redis中保存短信验证码内容
    7.返回发送成功的响应
    :return: 
    '''
    #1.接收参数并判断是否有值
    #去到请求值中的内容
    data = request.data
    data_dict = json.loads(data)
    mobile = data_dict.get('mobile')
    image_code = data_dict.get('image_code')
    image_code_id = data_dict.get('image_code_id')
    if not all([mobile,image_code_id,image_code]):
        return jsonify(errno=RET.PARAMERR,errmsg = '参数不全')
    #校验手机号是正确
    if not re.match('^1[3578][0-9]{9}$',mobile):
        return jsonify(errno = RET.PARAMERR,errmsg='手机号格式不正确')
    #通过传入的图片编码去redis中查询真是的图片验证码内容
    try:
        image_code_ider = 'ImageCode_' + image_code_id
        real_image_code = redis_store.get(image_code_ider)
        #如果取出来值那么就删除redis中的缓存内容
        if real_image_code:
            redis_store.delete(image_code_ider)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg= '获取图片验证码失败')
    # 判断验证码是否存在，已过期
    if not real_image_code:
        return jsonify(errno = RET.NODATA,errmsg = '验证码已过期')
    #进行验证码内容的比对
    if image_code.lower() != real_image_code.lower():
        return jsonify(errno = RET.DATAERR,errmsg = '验证码输入有误')
    #校验手机是否已经被注册
    try:
        user = User.query.filter_by(mobile = mobile).first()
    except Exception as e:
        user = None  #如果查询时出现错误，也需要给user初始化，如果不初始化，会报未定义的异常
        current_app.logger.error(e)
    if user:
        return jsonify(errno= RET.DATAERR,errmsg= '该手机已经被注册')
    #生成发送短信的内容并发送短信
    result = random.randint(0,999999)
    sms_code = '%06d'%result
    #TODO:  短信验证码 在控制台显示
    current_app.logger.debug('短信验证码内容%s'%sms_code)
    #redis中保存短信验证码内容
    try:
        redis_store.set('SMS_'+mobile,sms_code,constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.errno(e)
        return jsonify(errno= RET.DBERR,errmsg= '保存短信验证码失败')
    #返回发送成功的响应
    return jsonify(errno= RET.OK,errmsg='发送成功')